//package cn.com.connected.common.aop;
//
//import cn.com.connected.base.exception.BusinessException;
//import cn.com.connected.base.exception.ErrorCode;
//import com.google.common.util.concurrent.RateLimiter;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.Signature;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.time.Duration;
//import java.time.temporal.TemporalUnit;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.TimeUnit;
//
//@Aspect
//@Component
//public class RateLimitAspect {
//
//    /**日志对象*/
//    private static final Logger logger = LoggerFactory.getLogger(RateLimitAspect.class);
//
//    private ConcurrentHashMap<String, RateLimiter> RATE_LIMITER  = new ConcurrentHashMap<>();
//    private RateLimiter rateLimiter;
//
////    @Pointcut("@annotation(cn.com.connected.base.annotations.Limit)")
////    public void serviceLimit() {
////    }
//
//    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
//    public void requestMapping(){}
//
//    @Pointcut(value = "execution(* cn.com.connected.controller..*.*(..))")
//    public void connectedPackage() {}
//
//    @Around("requestMapping() && connectedPackage()")
//    public Object around(ProceedingJoinPoint point) throws Throwable {
//
////        重要 #################################################################   https://juejin.cn/post/7056000911893594148        #################################################################
////        permitsPerSecond：每秒产生的令牌数；
////        maxBurstSeconds： /** 桶中最多可以保存多少秒存入的令牌数 */
////        maxPermits：最大令牌数 等于permitsPerSecond*maxBurstSeconds
////        stableIntervalMicros：产生一个令牌所需的微秒数
////        toredPermits：当前已存储的令牌数；
////        nextFreeTicketMicros：核心参数，表示下一个可以分配令牌的时间点；**可以是过去也可以是将来的时间点
//
//        Object obj = null;
//        //获取拦截的方法名
//        Signature sig = point.getSignature();
//        //获取拦截的方法名
//        MethodSignature msig = (MethodSignature) sig;
//        //返回被织入增加处理目标对象
//        Object target = point.getTarget();
//        //为了获取注解信息
//        Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
////        //获取注解信息
////        Limit annotation = currentMethod.getAnnotation(Limit.class);
////        double limitNum = annotation.limitNum(); //获取注解每秒加入桶中的token
//        String functionName = msig.getName(); // 注解所在方法名区分不同的限流策略
//
//        double permitsPerSecond = 2; //每秒产生的令牌数
//        if(!RATE_LIMITER.containsKey(functionName)){
////            rateLimiter = RateLimiter.create(permitsPerSecond);
//            rateLimiter = RateLimiter.create(permitsPerSecond, Duration.ofSeconds(60l));
//            RATE_LIMITER.put(functionName,rateLimiter);
//            rateLimiter=RATE_LIMITER.get(functionName);
//        }
//        rateLimiter=RATE_LIMITER.get(functionName);
//        //rateLimiter.tryAcquire() 查看的是一秒内的令牌
//        //
//        if(rateLimiter.tryAcquire(1)) {
//            logger.info("执行成功！！！...做一些业务处理");
//            return point.proceed();
//        } else {
//            throw new BusinessException(ErrorCode.SERIOUS_REQUEST,"请求频繁");
//        }
//    }
//}